package com.jie.common.util;

import cn.hutool.core.convert.NumberWithFormat;
import cn.hutool.core.util.StrUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;

import java.util.HashMap;
import java.util.Map;

import static com.jie.common.constant.StrConst.USER_ID;

public class TokenUtil {

    // 密钥，可根据实际情况修改
    private static final String SECRET_KEY = "com.jie.xie-cheng";

    /**
     * 生成 JWT Token，仅包含用户 ID
     * @param userId 用户 ID
     * @return 生成的 JWT Token
     */
    public static String generateToken(Long userId) {
        // 创建签名器，使用 HMAC - SHA256 算法
        JWTSigner signer = JWTSignerUtil.hs256(SECRET_KEY.getBytes());

        Map<String, Object> payload = new HashMap<>();
        payload.put("userId", userId);

        // 生成 JWT Token
        return JWTUtil.createToken(payload, signer);
    }

    /**
     * 验证 JWT Token 是否有效
     * @param token 要验证的 JWT Token
     * @return 如果 Token 有效返回 true，否则返回 false
     */
    public static boolean verifyToken(String token) {
        if (StrUtil.isBlank(token)) {
            return false;
        }
        return JWTUtil.verify(token, SECRET_KEY.getBytes());
    }

    /**
     * 解析 JWT Token，获取用户 ID
     * @param token 要解析的 JWT Token
     * @return 用户 ID，如果 Token 无效或不包含 userId 字段则返回 null
     */
    public static Long getUserIdFromToken(String token) {
        if (verifyToken(token)) {
            JWT jwt = JWTUtil.parseToken(token);
            NumberWithFormat numberWithFormat = (NumberWithFormat) jwt.getPayload(USER_ID);
            return numberWithFormat.longValue();
        }
        return null;
    }


    public static void main(String[] args) {
        // 示例：生成 Token
        Long userId = 123L;
        String token = generateToken(userId);
        System.out.println("Generated Token: " + token);

        // 示例：验证 Token
        boolean isValid = verifyToken(token);
        System.out.println("Token is valid: " + isValid);

        // 示例：获取用户 ID
        Long parsedUserId = getUserIdFromToken(token);
        System.out.println("User ID from Token: " + parsedUserId);
    }
}